"""
配置 包括预定义用户
"""
from lib import SubmitResult
from lib import WebSeeesion
users=[]
with open("users.txt","r") as f:
    for l in f.readlines():
        users.append(l.strip())


#通用session 用户获取网站信息
sess=WebSeeesion()
#保存每个用户的提交记录

#username->List[SubmitResult]
submits={}
submit_probs={}
coin_list={}
def addsubmit(res:SubmitResult):
    """
    添加一个ac提交
    :param res: 提交对象
    :return: 0表示一个新题提交 1表示一题重复提交
    """
    if res.username not in submits:
        submits[res.username]=[]
        submit_probs[res.username]=[]
    submits[res.username].append(res)
    #只有提交一个新题AC时才加积分
    if res.problem.pid not in submit_probs[res.username]:
        submit_probs[res.username].append(res.problem.pid)
        #修改对应的积分
        if res.username in coin_list:
            coin_list[res.username]+=1
        else:
            coin_list[res.username]=1
        #保存
        saveall()
        return 0
    saveall()
    return 1



def get_coin(username):
    """
    获得某个用户的积分
    :param username: 用户名
    :return: 积分(float)
    """
    if username not in coin_list:
        return 0
    return coin_list[username]




#pageid->ProblemDesc 缓存的题目标题列表
problem_titles={}
#题号->Problem 缓存的题目列表
problem_list={}

def get_desc(pageid=1):
    """
    获取一页题目描述 如果没有加载 则加载 否则直接返回
    :param pageid: 页号
    :return: 题目desc列表
    """
    if pageid in problem_titles:
        return problem_titles[pageid]
    #获取一页
    lst=sess.get_problemList(pageid)
    problem_titles[pageid]=lst
    saveall()
    return lst


def get_problem(pid):
    """
    获取一个题目的内容 如果没有加载则加载  否则直接返回
    :param pid: 题目号
    :return: Problem对象
    """
    if pid in problem_list:
        return problem_list[pid]
    #获取一题
    prob=sess.get_problem(pid)
    problem_list[pid]=prob
    saveall()
    return prob



#退出和加载时的操作
import pickle
pack=(submit_probs,submits, coin_list, problem_titles, problem_list)
def saveall():
    with open("data.dat","wb") as f:
        #高效保存
        pickle.dump(pack,f,protocol=2)

#启动时读取所有
import os
if os.path.exists("data.dat"):
    with open("data.dat","rb") as f:
        submit_probs,submits, coin_list, problem_titles, problem_list=pickle.load(f)
